import re
import markdown
from flask import Flask, render_template, request, jsonify

md_path = r"asset\markdown_2_html.md"
# md_path = r"asset\mymd.md"
template_path = r"asset\template.html"
md_texts = [
"""
1. **客户端请求**：用户在浏览器中点击一个按钮，触发一个 HTTP 请求发送到服务器。
2. **服务器处理**：
    - 服务器接收到请求后，生成 Excel 文件。
    - 将生成的 Excel 文件作为 HTTP 响应返回给客户端。
3. **客户端下载**：浏览器接收到响应后，触发文件下载操作，用户可以选择保存文件到本地。
""",
"""
# 代码高亮测试

普通段落文本

```python
def hello_world():
    print("Hello, World!")
    return True
```
更多文本内容"""
]

# app.py
app = Flask(__name__, template_folder="asset/templates", static_folder="asset/static")  # 设置静态文件夹路径


def load_file():
    # 打开md文件
    with open(md_path, "r", encoding="utf-8") as f:
        md_text = f.read()
    # 读取 HTML 模板文件
    with open(template_path, 'r', encoding='utf-8') as file:
        template = file.read()
    return md_text, template


def fix_indentation(text):
    """
    将每行开头"   - "（3个空格+连字符+空格）替换为"    - "（4个空格+连字符+空格）
    """
    # 使用正则表达式匹配行开头的3空格+连字符+空格模式
    pattern = r'^( {3})(- )'
    # 替换为4空格+连字符+空格
    replacement = r'    \2'  # \2 引用第二个捕获组(- )

    # 对每一行进行处理
    lines = text.splitlines(keepends=True)
    fixed_lines = []
    for line in lines:
        fixed_line = re.sub(pattern, replacement, line)
        fixed_lines.append(fixed_line)

    return ''.join(fixed_lines)


def convert_markdown_with_highlight(html,contain_download=False):
    # 为标题添加锚点
    def add_anchor_to_heading(match):
        level = match.group(1)
        content = match.group(2)
        # 生成ID (移除空格和特殊字符)
        anchor_id = re.sub(r'[^\w]', '-', content.lower())
        return f'<h{level} id="{anchor_id}">{content} <a class="heading-anchor" href="#{anchor_id}">#</a></h{level}>'

    # 处理标题
    html = re.sub(
        r'<h([1-6])>(.*?)</h\1>',
        add_anchor_to_heading,
        html
    )

    # 为代码块添加容器和复制按钮
    def wrap_code_block(match):
        language = match.group(1) or 'text'
        code = match.group(2)
        return f'''
<div class="code-container">
    <div class="code-header">
        <span>{language}</span>
        <div class="btn-group">
            <span class="toggle-icon">▶</span> <!-- 折叠箭头 -->
            <button class="copy-btn">复制</button>
            {'<button class="download-btn">下载</button>' if contain_download else ''}
        </div>
    </div>
    <pre><code class="language-{language}">{code}</code></pre>
</div>
        '''

    # 使用正则表达式匹配代码块
    html = re.sub(
        r'<pre><code class="language-(.*?)">(.*?)</code></pre>',
        wrap_code_block,
        html,
        flags=re.DOTALL
    )

    # 处理没有语言标识的代码块
    html = re.sub(
        r'<pre><code>(.*?)</code></pre>',
        lambda m: wrap_code_block((None, 'text', m.group(1))),
        html,
        flags=re.DOTALL
    )

    # 生成目录
    def extract_headings(html):
        # 提取所有标题
        headings = []
        # 匹配 h1-h6 标签及其内容
        pattern = r'<h([1-6])\s+id="([^"]+)">(.*?)</h\1>'

        for match in re.finditer(pattern, html):
            level = int(match.group(1))
            heading_id = match.group(2)
            title = match.group(3)
            headings.append({
                'level': level,
                'id': heading_id,
                'title': title
            })

        return headings

    # 创建目录 HTML
    def create_toc(headings):
        if not headings:
            return ''

        # 找到最小的标题级别作为根级别
        min_level = min(h['level'] for h in headings)

        # 开始构建 HTML
        toc_html = '<div class="toc"><ul>'
        current_level = min_level

        for heading in headings:
            # 如果当前标题级别大于前一个，需要嵌套子列表
            while heading['level'] > current_level:
                toc_html += '<ul>'
                current_level += 1

            # 如果当前标题级别小于前一个，需要关闭之前的列表
            while heading['level'] < current_level:
                toc_html += '</li></ul>'
                current_level -= 1

            # 添加当前标题项
            toc_html += f'<li><a href="#{heading["id"]}">{heading["title"]}</a>'

        # 关闭所有剩余的标签
        while current_level >= min_level:
            toc_html += '</li></ul>'
            current_level -= 1

        toc_html += '</div>'  # 结束 toc
        return toc_html

    # 提取标题并生成目录
    headings = extract_headings(html)
    print('html',html)
    if headings:
        toc_html = create_toc(headings)
        # 将目录插入到内容顶部
        html = toc_html + html
    else:
        print("No headings found.")

    return html

@app.route('/')
def place_result():
    md_text, template = load_file()
    fixed_md_text = fix_indentation(md_text)  # 规范：4缩进
    md_result = markdown.markdown(fixed_md_text, extensions=['fenced_code','tables'])  # 把代码圈起来
    final_html = template.replace('{markdown_content}', md_result)  # 把md渲染到网页模板中
    # 为代码块添加容器和复制/下载按钮 html
    final_html = convert_markdown_with_highlight(final_html, contain_download=True)

    return final_html


if __name__ == '__main__':
    app.run(debug=True)
